package com.lpb.spring.lpbspring.ioc;

import org.apache.commons.lang3.StringUtils;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.List;

/**
 * @ClassName BeanDefinition
 * @Description bean的定义信息
 * 构造bean 的方式有 ：1、new 2、静态工厂方法 3、普通工厂方法
 * 所以bean的定义信息需要提供可以通过这三种方法构造对象的信息
 * 1、需要bean对象对应类的class 反射生成
 * 2、需要对应工厂类的class，和生成bean对象的静态方法名称，然后通过反射生成
 * 3、需要工厂对象对应的beanname，和生成bean对象的方法名称，然后通过反射生成
 * @date 2022/11/22 17:21
 * @Version 1.0
 * @authoe linpengbo
 */
public interface BeanDefinition {

    //作用域-单例
    public String scope_singletion="singleton";

    //作用域-原型
    public String scope_prototype="prototype";

    /**获取bean的class对象
     * @return
     */
    Class<?> getBeanClass();

    /**获取bean的作用域
     * @return
     */
    String getScope();

    /**获取生成bean的bean工厂类名称
     * @return
     */
    String getFactoryBeanName();

    /**获取工厂类里生成bean的方法名称
     * @return
     */
    String getFactoryMethodName();


    /**bean的初始化方法
     * @return
     */
    String getInitMethodName();

    /**获取构造参数集合
     * @return
     */
    List<?> getConstructorArgumentValues();

    Constructor<?> getConstructor();

    void setConstructor(Constructor<?> constructor);


    void setFactoryMethod(Method method);

    Method getFactoryMethod();


    List<PropertyValue> getPropertyValues();


    boolean isSingleton();

    boolean isPrototype();

    boolean isPrimary();

    /**对bean定义信息的校验
     * @return
     */
    default boolean validate() {
        if(this.getBeanClass()==null){
            if(StringUtils.isBlank(this.getFactoryBeanName())||StringUtils.isBlank(this.getFactoryMethodName())){
            // throw new Exception("在缺少bean的class对象信息的前提下,又缺少了工厂bean名称和工厂方法名称，无法生产bean");re
                return false;
            }
        }else{
            if(StringUtils.isNotBlank(this.getFactoryBeanName())){
               // throw new Exception("既定义了类信息，又定义了工厂bean信息，不合法 这两不能同时存在吗？？？");
              return false;
            }
        }
        return true;
    }

}
